package fr.afcepf.atod18.utilitaires.web;

import java.util.GregorianCalendar;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.SessionScoped;
import javax.inject.Inject;
import javax.inject.Named;

import org.aspectj.weaver.patterns.ThisOrTargetAnnotationPointcut;
import org.primefaces.model.DefaultTreeNode;
import org.primefaces.model.TreeNode;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.InitBinder;

import fr.afcepf.atod18.restaurants.entity.Boisson;
import fr.afcepf.atod18.restaurants.entity.Carte;
import fr.afcepf.atod18.restaurants.entity.Plat;
import fr.afcepf.atod18.restaurants.entity.Produit;
import fr.afcepf.atod18.restaurants.entity.Restaurant;
import fr.afcepf.atod18.restaurants.entity.TypeCuisine;
import fr.afcepf.atod18.restaurants.entity.TypeHoraire;
import fr.afcepf.atod18.restaurants.entity.TypePlat;
import fr.afcepf.atod18.restaurants.idao.IDaoBoisson;
import fr.afcepf.atod18.restaurants.idao.IDaoCarte;
import fr.afcepf.atod18.restaurants.idao.IDaoPlat;
import fr.afcepf.atod18.restaurants.idao.IDaoRestaurant;
import fr.afcepf.atod18.restaurants.idao.IDaoTypeCuisine;
import fr.afcepf.atod18.restaurants.idao.IDaoTypeHoraire;
import fr.afcepf.atod18.restaurants.idao.IDaoTypePlat;
import fr.afcepf.atod18.restaurants.service.IGestionRestaurant;
import fr.afcepf.atod18.utilitaires.entity.Rue;
import fr.afcepf.atod18.utilitaires.entity.TypeAdresse;
import fr.afcepf.atod18.utilitaires.idao.IDaoRue;
import fr.afcepf.atod18.utilitaires.idao.IDaoTypeAdresse;

@ManagedBean(name="listeObjetsMB")
@SessionScoped
public class ListeObjetsMB {

	private TreeNode listeObjets;
	private TreeNode utilitaires = null;
	private TreeNode client = null;
	private TreeNode restaurants = null;
	private TreeNode commande = null;
			
	@ManagedProperty(value="#{daoTypeAdresse}")
	IDaoTypeAdresse daoTypeAdresse;
	@ManagedProperty(value="#{daoTypeHoraire}")
	IDaoTypeHoraire daoTypeHoraire;
	@ManagedProperty(value="#{daoTypeCuisine}")
	IDaoTypeCuisine daoTypeCuisine;
	@ManagedProperty(value="#{daoTypePlat}")
	IDaoTypePlat daoTypePlat;
	@ManagedProperty(value="#{daoBoisson}")
	IDaoBoisson daoBoisson;
	@ManagedProperty(value="#{daoPlat}")
	IDaoPlat daoPlat;
	@ManagedProperty(value="#{daoRue}")
	IDaoRue daoRue;
	@ManagedProperty(value="#{daoCarte}")
	IDaoCarte daoCarte;
	@ManagedProperty(value="#{daoRestaurant}")
	IDaoRestaurant daoRestaurant;
	@ManagedProperty(value="#{gestionRestaurant}")
	IGestionRestaurant gestionRestaurant;
	
	public ListeObjetsMB() {
		super();
	}
	
	@PostConstruct
	public void Init() {
		listeObjets = new DefaultTreeNode("schemas siteresto_db", null);
        utilitaires = new DefaultTreeNode("package Utilitaires", listeObjets);
        client = new DefaultTreeNode("package Client", listeObjets);
        restaurants = new DefaultTreeNode("package Restaurants", listeObjets);
        commande = new DefaultTreeNode("package Commande", listeObjets);		
	}

	public TreeNode getListeObjets() {
		return listeObjets;
	}

	public void setListeObjets(TreeNode listeObjets) {
		this.listeObjets = listeObjets;
	}
	
	public String doInitSiteresto() {
		List<TypeAdresse> liste = daoTypeAdresse.findAll();
		daoTypeAdresse.deleteAll(liste);
		TypeAdresse ta1 = new TypeAdresse("G�ographique");
		daoTypeAdresse.ajouter(ta1);
		TypeAdresse ta2 = new TypeAdresse("Courrier");
		daoTypeAdresse.ajouter(ta2);
		TypeAdresse ta3 = new TypeAdresse("Facturation");
		daoTypeAdresse.ajouter(ta3);
		TypeAdresse ta4 = new TypeAdresse("Livraison");
		daoTypeAdresse.ajouter(ta4);

		List<TypeHoraire> liste2 = daoTypeHoraire.findAll();
		daoTypeHoraire.deleteAll(liste2);
		TypeHoraire th1 = new TypeHoraire("Ouverture");
		daoTypeHoraire.ajouter(th1);
		TypeHoraire th2 = new TypeHoraire("Livraison");
		daoTypeHoraire.ajouter(th2);
			
		List<TypeCuisine> liste3 = daoTypeCuisine.findAll();
		daoTypeCuisine.deleteAll(liste3);
		TypeCuisine tc1 = new TypeCuisine("Fran�aise");
		daoTypeCuisine.ajouter(tc1);
		TypeCuisine tc2 = new TypeCuisine("Chinoise");
		daoTypeCuisine.ajouter(tc2);
		TypeCuisine tc3 = new TypeCuisine("Japonaise");
		daoTypeCuisine.ajouter(tc3);
		TypeCuisine tc4 = new TypeCuisine("Fast Food");
		daoTypeCuisine.ajouter(tc4);

		List<TypePlat> liste4 = daoTypePlat.findAll();
		daoTypePlat.deleteAll(liste4);
		TypePlat tp1 = new TypePlat("Entr�e");
		daoTypePlat.ajouter(tp1);
		TypePlat tp2 = new TypePlat("Plat");
		daoTypePlat.ajouter(tp2);
		TypePlat tp3 = new TypePlat("Dessert");
		daoTypePlat.ajouter(tp3);
		TypePlat tp4 = new TypePlat("Accompagnements");
		daoTypePlat.ajouter(tp4);

		List<Boisson> liste5 = daoBoisson.findAll();
		daoBoisson.deleteAll(liste5);
		Boisson b1 = new Boisson("Vital Eau 1L","Bouteille d'eau de source",1.5d,true,null,100);
		daoBoisson.ajouter(b1);
		Boisson b2 = new Boisson("Vital Eau 50cl","Bouteille d'eau de source",.8d,true,null,50);
		daoBoisson.ajouter(b2);
		Boisson b3 = new Boisson("Kola Eau 50cl","cannette rouge",.8d,true,null,50);
		daoBoisson.ajouter(b3);
		Boisson b4 = new Boisson("Badoa Eau 50cl","Bouteille d'eau min�rale",.9d,true,null,50);
		daoBoisson.ajouter(b4);
		Boisson b5 = new Boisson("Hy-C Orange Eau 50cl","briquette de jus d'orange",.7d,true,null,33);
		daoBoisson.ajouter(b5);
		
		List<Plat> liste6 = daoPlat.findAll();
		daoPlat.deleteAll(liste6);
		List<TypePlat> entree = (List<TypePlat>) daoTypePlat.rechercherParNom("Entr�e");
		List<TypePlat> plat = (List<TypePlat>) daoTypePlat.rechercherParNom("Plat");
		List<TypePlat> dessert = (List<TypePlat>) daoTypePlat.rechercherParNom("Dessert");
		List<TypePlat> accompagnements = (List<TypePlat>) daoTypePlat.rechercherParNom("Accompagnements");
		
		Plat p1 = new Plat("Salade c�sar","salade : laitue, jambon, oeuf",2.5d,true,null,false,entree.get(0));
		daoPlat.ajouter(p1);
		Plat p2 = new Plat("Pizza","part de pizza",2.1d,true,null,false,entree.get(0));
		daoPlat.ajouter(p2);
		Plat p3 = new Plat("Nems au poulet","nems � base de poulet",2.15d,true,null,false,entree.get(0));
		daoPlat.ajouter(p3);
		Plat p4 = new Plat("Crevettes au sel","crevettes non d�cortiqu�e cuites au sel",6.0d,true,null,false,plat.get(0));
		daoPlat.ajouter(p4);
		Plat p5 = new Plat("Poisson � la sauce piquante","poisson cuit avec une sauce piquante",4.5d,true,null,false,plat.get(0));
		daoPlat.ajouter(p5);
		Plat p6 = new Plat("Poisson cru au lait de coco","poisson cru au lait de coco",8.5d,true,null,false,plat.get(0));
		daoPlat.ajouter(p6);
		Plat p7 = new Plat("sashimi de thon rouge","tranche de thon rouge frais",8.5d,true,null,false,plat.get(0));
		daoPlat.ajouter(p7);
		Plat p8 = new Plat("Tarte aux fruits","tranche de tarte aux fruits",2.0d,true,null,false,dessert.get(0));
		daoPlat.ajouter(p8);
		Plat p9 = new Plat("Riz nature","riz parfum� cuit � la vapeur",0.5d,true,null,false,accompagnements.get(0));
		daoPlat.ajouter(p9);
		Plat p10 = new Plat("Pommes de terre saut�es","Pommes de terre cuits � la vapeur",0.5d,true,null,false,accompagnements.get(0));
		daoPlat.ajouter(p10);
		Plat p11 = new Plat("G�teau au coco","G�teau cuit avec des morceau de coco",1.5d,true,null,false,dessert.get(0));
		daoPlat.ajouter(p11);

		List<Rue> liste7 = daoRue.findAll();
		daoRue.deleteAll(liste7);
		Rue rue1 = new Rue("Rue Danton");
		daoRue.ajouter(rue1);
		Rue rue2 = new Rue("Avenue Pierre Larousse");
		daoRue.ajouter(rue2);
		Rue rue3 = new Rue("Rue Ernest Renan");
		daoRue.ajouter(rue3);
		Rue rue4 = new Rue("Rue Raymond Fassin");
		daoRue.ajouter(rue4);
		Rue rue5 = new Rue("Rue Gabetta");
		daoRue.ajouter(rue5);
		Rue rue6 = new Rue("Avenue de la R�publique");
		daoRue.ajouter(rue6);
		Rue rue7 = new Rue("Avenue Aristide Briand");
		daoRue.ajouter(rue7);

		List<Carte> liste8 = daoCarte.findAll();
		daoCarte.deleteAll(liste8);
		Set<Produit> produits = new HashSet<Produit>();
		produits.add(p3);
		produits.add(p9);
		produits.add(p4);
		produits.add(p6);
		produits.add(p7);
		produits.add(p10);
		produits.add(p8);
		produits.add(p11);
		Carte carte1 = new Carte(new GregorianCalendar(2013, 1, 2), null, produits);
		daoCarte.ajouter(carte1);
		
		List<Restaurant> liste9 = daoRestaurant.findAll();
		daoRestaurant.deleteAll(liste9);
		List<Carte> cart1 = daoCarte.rechercherParId(1);
		List<TypeCuisine> typcfr = daoTypeCuisine.rechercherParId(1);
		List<TypeCuisine> typcch = daoTypeCuisine.rechercherParId(2);
		List<TypeCuisine> typcjp = daoTypeCuisine.rechercherParId(3);
		List<TypeCuisine> typcff = daoTypeCuisine.rechercherParId(4);
		Restaurant rest2 = new Restaurant("LittleWok",25,25,typcch.get(0),null);
		gestionRestaurant.ajouterRestaurant(rest2);
		Restaurant rest6 = new Restaurant("au bon accueil",24,30,typcjp.get(0),cart1);
		gestionRestaurant.ajouterRestaurant(rest6);
		Restaurant rest1 = new Restaurant("Murex",20,20,typcff.get(0),null);
		gestionRestaurant.ajouterRestaurant(rest1);
		Restaurant rest3 = new Restaurant("le Libanais",20,15,typcff.get(0),null);
		gestionRestaurant.ajouterRestaurant(rest3);
		Restaurant rest4 = new Restaurant("le cochon qui rit",15,25,typcfr.get(0),null);
		gestionRestaurant.ajouterRestaurant(rest4);
		Restaurant rest5 = new Restaurant("l'auberge de Venise",30,35,typcfr.get(0),null);
		gestionRestaurant.ajouterRestaurant(rest5);
		Restaurant rest7 = new Restaurant("balto",50,35,typcfr.get(0),null);
		gestionRestaurant.ajouterRestaurant(rest7);
		Restaurant rest8 = new Restaurant("voltigeur",45,20,typcfr.get(0),null);
		gestionRestaurant.ajouterRestaurant(rest8);
		
		addNode();
		return null;
	}
	
	
	public void addNode() {
		
        TreeNode typeAdresse = new DefaultTreeNode("Table TypeAdresse", this.utilitaires);
		List<TypeAdresse> liste = daoTypeAdresse.findAll();
		for(int i=0; i < liste.size(); i++) {
	        TreeNode ta1 = new DefaultTreeNode(liste.get(i).getLibelle(), typeAdresse);
		}
		
        TreeNode typeHoraire = new DefaultTreeNode("Table TypeHoraire", this.restaurants);
		List<TypeHoraire> liste2 = daoTypeHoraire.findAll();
 		for(int i=0; i < liste2.size(); i++) {
	        TreeNode ta2 = new DefaultTreeNode(liste2.get(i).getLibelle(), typeHoraire);
		}

        TreeNode typeCuisine = new DefaultTreeNode("Table TypeCuisine", this.restaurants);
		List<TypeCuisine> liste3 = daoTypeCuisine.findAll();
        System.out.println("nb liste=" + liste3.size());
		for(int i=0; i < liste3.size(); i++) {
	        System.out.println("element liste=" + liste3.get(i).getLibelle());
	        TreeNode ta3 = new DefaultTreeNode(liste3.get(i).getLibelle(), typeCuisine);
		}
	
        TreeNode typePlat = new DefaultTreeNode("Table TypePlat", this.restaurants);
		List<TypePlat> liste4 = daoTypePlat.findAll();
		for(int i=0; i < liste4.size(); i++) {
	        TreeNode tab4 = new DefaultTreeNode(liste4.get(i).getLibelle(), typePlat);
		}

        TreeNode boisson = new DefaultTreeNode("Table Boisson", this.restaurants);
		List<Boisson> liste5 = daoBoisson.findAll();
		for(int i=0; i < liste5.size(); i++) {
	        TreeNode tab5 = new DefaultTreeNode(liste5.get(i).getNom(), boisson);
		}

        TreeNode plat = new DefaultTreeNode("Table Plat", this.restaurants);
		List<Plat> liste6 = daoPlat.findAll();
		for(int i=0; i < liste6.size(); i++) {
	        TreeNode tab6 = new DefaultTreeNode(liste6.get(i).getNom(), plat);
		}

        TreeNode rue = new DefaultTreeNode("Table Rue", this.utilitaires);
		List<Rue> liste7 = daoRue.findAll();
		for(int i=0; i < liste7.size(); i++) {
	        TreeNode tab7 = new DefaultTreeNode(liste7.get(i).getNomRue(), rue);
		}

        TreeNode carte = new DefaultTreeNode("Table Carte", this.restaurants);
		List<Carte> liste8 = daoCarte.findAll();
		for(int i=0; i < liste8.size(); i++) {
	        TreeNode tab8 = new DefaultTreeNode(liste8.get(i).getValiditeDebut().toString(), carte);
		}
		
        TreeNode restaurant = new DefaultTreeNode("Table Restaurant", this.restaurants);
		List<Restaurant> liste9 = daoRestaurant.findAll();
		for(int i=0; i < liste9.size(); i++) {
	        TreeNode tab9 = new DefaultTreeNode(liste9.get(i).getNom(), restaurant);
		}
	}

	public IDaoTypeAdresse getDaoTypeAdresse() {
		return daoTypeAdresse;
	}

	public void setDaoTypeAdresse(IDaoTypeAdresse daoTypeAdresse) {
		this.daoTypeAdresse = daoTypeAdresse;
	}

	public IDaoTypeHoraire getDaoTypeHoraire() {
		return daoTypeHoraire;
	}

	public void setDaoTypeHoraire(IDaoTypeHoraire daoTypeHoraire) {
		this.daoTypeHoraire = daoTypeHoraire;
	}

	public IDaoTypeCuisine getDaoTypeCuisine() {
		return daoTypeCuisine;
	}

	public void setDaoTypeCuisine(IDaoTypeCuisine daoTypeCuisine) {
		this.daoTypeCuisine = daoTypeCuisine;
	}

	public IDaoTypePlat getDaoTypePlat() {
		return daoTypePlat;
	}

	public void setDaoTypePlat(IDaoTypePlat daoTypePlat) {
		this.daoTypePlat = daoTypePlat;
	}

	public IDaoBoisson getDaoBoisson() {
		return daoBoisson;
	}

	public void setDaoBoisson(IDaoBoisson daoBoisson) {
		this.daoBoisson = daoBoisson;
	}

	public IDaoPlat getDaoPlat() {
		return daoPlat;
	}

	public void setDaoPlat(IDaoPlat daoPlat) {
		this.daoPlat = daoPlat;
	}

	public IDaoRue getDaoRue() {
		return daoRue;
	}

	public void setDaoRue(IDaoRue daoRue) {
		this.daoRue = daoRue;
	}

	public IDaoCarte getDaoCarte() {
		return daoCarte;
	}

	public void setDaoCarte(IDaoCarte daoCarte) {
		this.daoCarte = daoCarte;
	}

	public IDaoRestaurant getDaoRestaurant() {
		return daoRestaurant;
	}

	public void setDaoRestaurant(IDaoRestaurant daoRestaurant) {
		this.daoRestaurant = daoRestaurant;
	}

	public IGestionRestaurant getGestionRestaurant() {
		return gestionRestaurant;
	}

	public void setGestionRestaurant(IGestionRestaurant gestionRestaurant) {
		this.gestionRestaurant = gestionRestaurant;
	}
	
	
	
}
